package thread.test;

/**
 * 注意: 包子铺线程和包子线程关系--->通信(互斥)
 *      必须同时同步技术保证两个线程只能有一个在执行
 *      锁对象必须保证唯一,可以使用包子对象作为锁对象
 *      包子铺类和吃货的类就需要把包子对象作为参数传递进去
 *          1.需要在成员位置创建一个包子变量
 *          2.使用带参数构造方法,为这个包子变量赋值
 */
public class BaoZiPu extends Thread {

    private Baozi bz;  //包子变量

    public BaoZiPu(Baozi baozi) {
        bz = baozi;
    }

    //设置线程任务(run),生产包子
    @Override
    public void run() {
        int count = 0;  //定义一个变量
        //让包子铺一直成产包子
        while (true){
            //必须同时同步技术保证两个线程只能有一个在执行
            synchronized (bz){
                if (bz.flag==true){
                    //包子铺调用wait方法进入等待状态
                    try {
                        bz.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //被唤醒之后执行,包子铺生产包子
                //增加一些趣味性:交替生产两种包子
                if (count%2==0){
                    bz.pi="薄皮";
                    bz.xian="三鲜馅";
                }else{
                    bz.pi="厚皮";
                    bz.xian="牛肉大葱馅";
                }
                count++;
                System.out.println("包子铺正在生产:"+bz.pi+bz.xian);
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //包子铺生产好了包子
                bz.flag=true;   //修改包子状态
                //唤醒吃货线程,让吃货线程池包子
                bz.notify();
                System.out.println("包子铺已经生产好了:"+bz.pi+bz.xian+"包子");
            }
        }

    }
}
